// 抽象类
// 在定义很多通用接口,我们通常会让调用者出入父类,通过多态来实现更加灵活的调用方式
// 但是,父类本身可能并不需要对某些方法进行具体的实现,所以父类中定义的方法 我们可以定义为抽象方法
//抽象方法必须存在抽象类中
//抽象类是使用abstract声明的类

// 抽象类有如下特点
// 抽象类是不能被实例的话(也就是不能通过new创建)
// 抽象方法必须被子类实现,否则该类必须是一个抽象类

//定义抽象类
abstract class Shape {
    abstract getArea(): number
}

//
class Circle extends Shape {
    private r: number
    constructor(r: number) {
        super()
        this.r = r
    }
    getArea(): number {
        return this.r * this.r * 3.14
    }
}

class Rectangle extends Shape {
    private width: number
    private height: number
    constructor(width: number, height: number,) {
        super()
        this.width = width
        this.height = height
    }
    getArea(): number {
        return this.width * this.height
    }
}


const circle = new Circle(10)
const rectangle = new Rectangle(20,30)

function calcArea(shape: Shape){    //参数是抽象类Shape的子类,这里用到类的类型
    console.log(shape.getArea())    //返回固定的面积
}

calcArea(circle)        //314
calcArea(rectangle)     //600

//类的类型
//赋值变量时
class Person{
    name: string;
    constructor(name: string){
        this.name = name;
    }
    running(){
        console.log(this.name+" running");
    }
}

const p1: Person  = new Person("why")
const p2: Person = {
    name: "kobe",
    running: function(){
        console.log(this.name+" running");
    }
}

//函数参数检测为类的类型
// 见calcArea函数
function calcArea2(shape: Shape){    //参数是抽象类Shape的子类,这里用到类的类型
    console.log(shape.getArea())    //返回固定的面积
}
export{}


